package cn.wen.yinxiu.works.dao;

import cn.wen.yinxiu.works.entity.DiagnosisEntity;
import cn.wen.yinxiu.works.entity.WorksDataEntity;
import cn.wen.yinxiu.works.entity.WorksEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * @ClassName: WorksDao
 * @Author 小飞
 * @Email coderwen22@163.com
 * @Date 2023-05-22 09:39:56
 * @Description: 的Dao层
 */
@Component
@Mapper
public interface WorksDao extends BaseMapper<WorksEntity> {

    /**
     * 获取作品点赞列表
     */
    List<WorksEntity> selectWorksLikeList(@Param("userId") Long userId,
                                          @Param("keyword") String keyword,
                                          @Param("page") Integer page,
                                          @Param("pageSize") Integer pageSize,
                                          @Param("status") Integer status,
                                          @Param("isDeleted") Integer isDeleted);

    /**
     * 获取作品收藏列表
     */
    List<WorksEntity> selectWorksCollectList(@Param("userId") Long userId,
                                             @Param("page") Integer page,
                                             @Param("pageSize") Integer pageSize,
                                             @Param("status") Integer status,
                                             @Param("isDeleted") Integer isDeleted);

    /**
     * 获取用户浏览记录
     */
    List<WorksEntity> selectWorksVisitHistoryList(@Param("userId") Long userId,
                                                  @Param("page") Integer page,
                                                  @Param("pageSize") Integer pageSize,
                                                  @Param("status") Integer status,
                                                  @Param("isDeleted") Integer isDeleted);


    /**
     * 获取指定周期内的数据
     *
     * @param userId
     * @param startTime
     * @param endTime
     * @param status
     * @param isDeleted
     * @return
     */
    @MapKey("DATE")
    List<Map<String, Object>> getWorksByTwoWeek(@Param("userId") Long userId,
                                                @Param("startTime") String startTime,
                                                @Param("endTime") String endTime,
                                                @Param("status") Integer status,
                                                @Param("isDeleted") Integer isDeleted);

    /**
     * 获取用户作品基本信息
     *
     * @param userIds
     * @param status
     * @param isDeleted
     * @return
     */
    @MapKey("userId")
    Map<Long, WorksDataEntity> selectWorksDataByUser(@Param("userIds") List<Long> userIds,
                                                     @Param("status") Integer status,
                                                     @Param("isDeleted") Integer isDeleted);

    /**
     * 统计用户的作品数量 / 播放和 / 收藏量 / 下载量
     *
     * @param userIds
     * @param startTime
     * @param endTime
     * @param status
     * @param isDeleted
     * @return
     */
    List<DiagnosisEntity> selectWorksDiagnosisByUser(@Param("userIds") List<Long> userIds,
                                                     @Param("startTime") String startTime,
                                                     @Param("endTime") String endTime,
                                                     @Param("status") Integer status,
                                                     @Param("isDeleted") Integer isDeleted);

    /**
     * 获取所有数据的统计
     *
     * @param status
     * @param isDeleted
     * @return
     */
    WorksDataEntity selectWorksData(@Param("status") Integer status,
                                    @Param("isDeleted") Integer isDeleted);

    /**
     * 获取上周发布过作品的用户
     *
     * @param startTime
     * @param endTime
     * @param status
     * @param isDeleted
     * @return
     */
    List<Long> getUserIdByWorksActive(@Param("startTime") String startTime,
                                      @Param("endTime") String endTime,
                                      @Param("status") Integer status,
                                      @Param("isDeleted") Integer isDeleted);

    /**
     * 添加到推荐数据中
     *
     * @param userId
     * @param topicIds
     * @param worksIds
     * @return
     */
    boolean saveRecommendTopic(@Param("userId") Long userId,
                               @Param("topicIds") String topicIds,
                               @Param("worksIds") String worksIds);

    /**
     * 删除用户数据
     * @param userId
     */
    void deleteRecommendByUserId(@Param("userId") Long userId);

    /**
     * 获取推荐列表字符串
     *
     * @param userId
     * @return
     */
    String getWorksIdsByUserId(@Param("userId") Long userId);

    /**
     * 获取分类的数据
     *
     * @param status
     * @param isDeleted
     * @param grade
     * @param typeId
     * @param pastDate
     * @param alreadyWorksIds
     * @param randomCount
     * @param pageSize
     * @return
     */
    List<WorksEntity> queryTypeWorksList(@Param("status") Integer status,
                                         @Param("isDeleted") Integer isDeleted,
                                         @Param("grade") int grade,
                                         @Param("typeId") Long typeId,
                                         @Param("pastDate") String pastDate,
                                         @Param("alreadyWorksIds") List<Long> alreadyWorksIds,
                                         @Param("randomCount") int randomCount,
                                         @Param("pageSize") int pageSize);

    /**
     * 获取指定类型的作品数量
     * @param typeId
     * @return
     */
    Long queryWorksCountByTypeId(@Param("typeId") Long typeId);

    /**
     * 添加或者减少评论数量
     *
     * @param worksId
     */
    void updateWorksCommentNum(@Param("worksId") Long worksId, @Param("num") Integer num);
}